package com.atguigu.tingshu.user.service.impl;

import com.alibaba.fastjson.JSON;
import com.atguigu.tingshu.common.constant.SystemConstant;
import com.atguigu.tingshu.common.rabbit.constant.MqConst;
import com.atguigu.tingshu.common.rabbit.service.RabbitService;
import com.atguigu.tingshu.common.util.MongoUtil;
import com.atguigu.tingshu.model.user.UserListenProcess;
import com.atguigu.tingshu.user.service.UserListenProcessService;
import com.atguigu.tingshu.vo.album.TrackStatMqVo;
import com.atguigu.tingshu.vo.user.UserListenProcessVo;
import org.bson.types.ObjectId;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

@Service
@SuppressWarnings({"all"})
public class UserListenProcessServiceImpl implements UserListenProcessService {

	@Autowired
	private MongoTemplate mongoTemplate;

	@Autowired
	private RedisTemplate redisTemplate;

	@Autowired
	private RabbitService rabbitService;

	/**
	 * 保存（更新）声音播放进度
	 * @param userId
	 * @param userListenProcessVo
	 */
	@Override
	public void saveOrUpdateListenProcess(Long userId, UserListenProcessVo userListenProcessVo) {
		//思路：1、先在MongoDB中查询 当前用户id+声音id是否有播放进度
		Criteria criteria = Criteria.where("userId").is(userId)
				.and("trackId").is(userListenProcessVo.getTrackId());
		Query query = new Query(criteria);

		//播放进度
		UserListenProcess userListenProcess = mongoTemplate.findOne(query,
				UserListenProcess.class,
				MongoUtil.getCollectionName(
						MongoUtil.MongoCollectionEnum.USER_LISTEN_PROCESS,
						userId));
		//2、如果有播放进度，就进行更新
		if(null != userListenProcess){
			//设置新播放进度
			userListenProcess.setBreakSecond(userListenProcessVo.getBreakSecond());
			//设置更新时间
			userListenProcess.setUpdateTime(new Date());
			//更新播放进度
			mongoTemplate.save(userListenProcess,
					MongoUtil.getCollectionName(MongoUtil.MongoCollectionEnum.USER_LISTEN_PROCESS, userId));
		}else{
			//3、如果没有播放进度，说明第一次添加。添加
			userListenProcess = new UserListenProcess();
			BeanUtils.copyProperties(userListenProcessVo, userListenProcess);
			//	设置Id
			userListenProcess.setId(ObjectId.get().toString());
			//	设置用户Id
			userListenProcess.setUserId(userId);
			//	设置是否显示
			userListenProcess.setIsShow(1);
			//	创建时间
			userListenProcess.setCreateTime(new Date());
			//	更新时间
			userListenProcess.setUpdateTime(new Date());
			mongoTemplate.save(userListenProcess,
					MongoUtil.getCollectionName(
							MongoUtil.MongoCollectionEnum.USER_LISTEN_PROCESS,
							userId));
		}

		//更新声音播放量
		//** 同一个用户，对于同一个声音播放，24小时只是算一次播放
		//使用redis实现 bit类型
		//** redis key：userId  偏移量：声音id   value：1
		//1 getbit方法根据userId + 声音id 获取数据
		//key 是用户ID，value是声音ID
		String key = "user:track:"+userListenProcessVo.getTrackId() + userId;
		//判断redis中是否存在
		Boolean isExist = redisTemplate.opsForValue().getBit(key, userListenProcessVo.getTrackId());
		//2 如果获取不到，表示是第一次更新播放量，使用setbit方法放数据
		if (!isExist) {
			//使用setbit方法放数据
			//  key：userId  偏移量：声音id   value：1
			redisTemplate.opsForValue().setBit(key, userListenProcessVo.getTrackId(), true);
			//3 设置key过期时间24小时
			redisTemplate.expire(key,24*60*60, TimeUnit.SECONDS);

			//4 调用方法更新声音播放量
			// 发送消息，更新播放量统计
			TrackStatMqVo trackStatMqVo = new TrackStatMqVo();
			trackStatMqVo.setBusinessNo(UUID.randomUUID().toString().replaceAll("-",""));
			trackStatMqVo.setAlbumId(userListenProcessVo.getAlbumId());
			trackStatMqVo.setTrackId(userListenProcessVo.getTrackId());
			trackStatMqVo.setStatType(SystemConstant.TRACK_STAT_PLAY);
			trackStatMqVo.setCount(1);
			rabbitService.sendMessage(MqConst.EXCHANGE_TRACK,
					MqConst.ROUTING_TRACK_STAT_UPDATE,
					JSON.toJSONString(trackStatMqVo));
		}
	}
}
